#include "../import/head.h"
#include "get_aio.h"
#include "../data_struct/head.h"
#include "../global/head.h"
#include "../macro/head.h"
#include "../msg/head.h"
#include "os_init.h"

namespace xos_sgsj
{
    get_aio::get_aio()
    {
        m_pAioMgr = 0;
        m_pAio = 0;
    }

    get_aio::~get_aio()
    {
        term();
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int get_aio::run_task( xos::i_msg * pMsg )
    {
        int ret = 0;

        data * p = g_pSysData->m_pPool->m_data_pool.GetItem();
        p->init();
        p->m_nMsg = MSG_NET;
        p->m_pMsg = pMsg;
        g_pSysData->m_pImpl->notify( p );
        p = 0;

        return ret;
    }

    int get_aio::init()
    {
        int ret = 0;

        xos::i_xos * pXosImpl = g_pSysData->m_os.m_pXos;
        xos_log::i_log * pLog = g_pSysData->m_os.m_pLog;

        if( 0 == ret )
        {
            xos_aio::create( pXosImpl, pLog, &m_pAioMgr );
            if( !m_pAioMgr )
            {
                ret = 1;
            }
        }

        if( 0 == ret )
        {
            ret = m_pAioMgr->create( &m_pAio );
        }

        if( 0 == ret )
        {
            m_pAioMgr->set_callback_thread( g_pSysData->m_os.m_pMiscCallbackThread );
            m_pAio->set_callback( this );
        }

        if( 0 == ret )
        {
            g_pSysData->m_os.m_pAioMgr = m_pAioMgr;
            g_pSysData->m_os.m_pAio = m_pAio;
        }

        return ret;
    }

    int get_aio::term()
    {
        int ret = 0;

        g_pSysData->m_os.m_pAioMgr = 0;
        g_pSysData->m_os.m_pAio = 0;

        if( m_pAio )
        {
            m_pAio->release();
            m_pAio = 0;
        }

        if( m_pAioMgr )
        {
            m_pAioMgr->release();
            m_pAioMgr = 0;
        }

        return ret;
    }

} // xos_sgsj
